"""
CPM/Config: Сборка файла настроек для cpm
Author: Milinuri Nirvalen
Ver: 2.0
"""

from utils import fcheck, package_base, check_params

import os
import toml


# Путь к директории данных cpm
config_path = "cpm_data/"

"""
Определние коренных настроек cpm
--------------------------------
repo_base: Описание репозитория по умолчанию

config_base: Описание настроек по умолчанию
    ignore_pid: PID пакетов, которые не попадут в индекс
    split_pid: На сколько нужно укоротить PID пакета

"""

repo_base = {"url": "load files link", "update": 0}
config_base = {"ignore_pid":["cpm"], "split_pid":0}

# Вспомогательные функции
# =======================

def load_file(path):
    """Загружает .toml файл по его пути.
    :param path: Путь к фалу

    :returns: Данные из файла"""

    if not path.count('.'):
        path += '.toml'

    if not os.path.exists(path):
        return {}

    with open(path) as f:
        try:
            return toml.loads(f.read())
        except Exception as e:
            print(e)
            return {}

def save_file(path, data):
    """Записываем данные в .toml файл по его пути.

    :param path: Путь к файлу для записи
    :param data: Данные для записи в файл

    :returns: Записанные данные в файл"""

    if not path.count('.'):
        path += '.toml'

    if path.count('/') > 1:
        fcheck(path.rsplit('/', 1)[0], True)

    with open(path, 'w') as f:
        f.write(toml.dumps(data))
        return data


class Config:
    """Сборка информации из папки с данными cpm"""

    def __init__(self):
        super(Config, self).__init__()
        fcheck(config_path)

        self.repositories_path = os.path.join(
            config_path, 'repositories.toml')
        self.package_base_path = os.path.join(
            config_path, 'package_base.toml')
        self.config_path = os.path.join(config_path, "config.toml")

        """
            package_base.toml: параметров пакета по умолчанию
            repositories.toml: Репозиториев для cpm
            config.toml: Основные настройки cpm

            Список репозиториев
            ===================
            name: {url: str, updated: int}
                name: Имя репозитория
                url: ССылка для загрузки файлов
                updated: Время последнего обновления репозиотрия
        """
        self.repositories = {
            "chiohub": {
                "url": "https://notabug.org/pentergust/ChioHub/raw/master/",
                "updated": 0},
            "cpm": {
                "url": "https://notabug.org/pentergust/cpm/raw/master",
                "updated": 0}}

    def read(self):
        """Читает файл настроек из config_path.
        Если файл отцуцтвует, создаёт его.

        :return: Данные настроек cpm"""

        config = {"repositories":{}}

        
        # Чтение списка репозиториев
        # --------------------------

        if not os.path.exists(self.repositories_path):
            config["repositories"] = self.repositories
            save_file(self.repositories_path, self.repositories)
        
        else:
            for k, v in load_file(self.repositories_path).items():
                config["repositories"][k] = check_params(v, repo_base)


        # Чтение параметров пакета по умолчанию
        # -------------------------------------

        if not os.path.exists(self.package_base_path):
            config["package_base"] = package_base
            save_file(self.package_base_path, package_base)
        else:
            config["package_base"] = load_file(self.package_base_path)

        # Чтение общих настроек cpm
        # -------------------------

        if not os.path.exists(self.config_path):
            config.update(config_base)
            save_file(self.config_path, config_base)
        else:
            config.update(check_params(load_file(self.config_path),
                                       config_base))

        return config
